/* 
  typeof 只能识别这几种类型
  Undefined Null Boolean String Number Object
  返回值：
  undefined object boolean string number object
  2 Object.prototype.toString可以识别更多的类型
  返回格式：'[objec class]'
  class类型有：
  Undefined Null Boolean String Number
  Object Array Function Error RegExp Math Date

  3 type函数，基本数据类型使用typeof 判断 引用类型使用toString判断
*/

// 第二版
var class2type = {};

// 生成class2type映射
'Boolean Number String Function Array Date RegExp Object Error'.split(' ').map(function (item) {
  class2type['[object ' + item + ']'] = item.toLowerCase();
});

function type(obj) {
  // 一箭双雕
  if (obj == null) {
    return obj + '';
  }
  return typeof obj === 'object' || typeof obj === 'function'
    ? class2type[Object.prototype.toString.call(obj)] || 'object'
    : typeof obj;
}
